﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Visual_App
{
    /// <summary>
    /// Ist das Remote-interface der Visu
    /// </summary>
    class cls_Remote_Interf: MarshalByRefObject, IVisual.I_visual
    {
        private static StringBuilder _INH = new StringBuilder();

        /// <summary>
        /// legt einen Fehlereintrag auf den E_Stack
        /// </summary>
        /// <param name="err"></param>
        /// <param name="Series"></param>
        public void update_error(double err, int Series)
        {
            //Unter Windows kann ein einzelner 32bit-Prozess generell nicht mehr als 2 GB belegen, außer IMAGE_FILE_LARGE_ADDRESS_AWARE ist im Header der Anwendung aktiviert (dann sind bis zu 4 GB möglich)
            if (System.Environment.WorkingSet / 1024 / 1024 < 1024)//Nur hinzufügen wenn die Anwendung noch keine 1 GB RAM belegt, es kommen ja noch die Charts dazu
                Program._Instance._Stack_E.Add(new Tuple<double, int>(err, Series));
            else
            {
                IVisual._SC.cls_LOG.WRITE_LOG_LINE(IVisual._SC.cls_LOG.LOGLEVEL.ERROR, "Grenzwertiger Arbeitsspeicherbedarf, deshalb auslassen!");
                Program._Instance.FEHLER++;
            }
            //Program._Instance.update_error(err, Series);
        }

        /// <summary>
        /// legt ein Netzwerk auf den N_Stack
        /// </summary>
        /// <param name="N"></param>
        public void draw(IVisual.I_Network N)
        {
            //Unter Windows kann ein einzelner 32bit-Prozess generell nicht mehr als 2 GB belegen, außer IMAGE_FILE_LARGE_ADDRESS_AWARE ist im Header der Anwendung aktiviert (dann sind bis zu 4 GB möglich)
            if (System.Environment.WorkingSet / 1024 / 1024 < 1024)//Nur hinzufügen wenn die Anwendung noch keine 1 GB RAM belegt, es kommen ja noch die Charts dazu
                Program._Instance._Stack_N.Add(N);
            else
            {
                IVisual._SC.cls_LOG.WRITE_LOG_LINE(IVisual._SC.cls_LOG.LOGLEVEL.ERROR, "Grenzwertiger Arbeitsspeicherbedarf, deshalb auslassen!");
                Program._Instance.FEHLER++;
            }
            //Program._Instance.draw(N);
        }

        /// <summary>
        /// Initialisiert die Visu
        /// </summary>
        /// <param name="Eingabemuster_anz"></param>
        public void INIT(int Eingabemuster_anz)
        {
            Program._Instance.Eingabemuster_anz = Eingabemuster_anz;
        }

        /// <summary>
        /// Reset der Visu
        /// </summary>
        /// <param name="mode"></param>
        /// <param name="args"></param>
        public void RESET(string mode = "Logic", params object[] args)
        {
            Program._Instance.RESET(mode, args);
        }

        /// <summary>
        /// Legt den neuen Teil des Rechenlogs in den Cache
        /// </summary>
        /// <param name="s">Einagestring</param>
        public void push_Rechen_Log(string s)
        {
            if (_INH.Length > 15000)
                _INH.Clear();
            _INH.Append(s);
        }

        /// <summary>
        /// Gibt den Rechenlog.Cache zurück und leert diesen dann
        /// </summary>
        /// <returns></returns>
        public static string Rechen_log()
        {
            string txt = "";

            try
            {
                txt = _INH.ToString();
            }
            catch (Exception ex)
            {
                txt = ex.Message;
            }

            _INH.Clear();
            return txt;
        }

        /// <summary>
        /// Setzt das Netzwerk nachdem das Leren abgeschlossen ist (Veraltet)
        /// </summary>
        /// <param name="N"></param>
        /// <param name="I"></param>
        /// <param name="O"></param>
        public void SET_FINAL_NETWORK(IVisual.I_Network N, float[][] I, float[][] O)
        {
            Program._Instance.SET_FINAL_NETWORK(N, I, O);
        }
    }
}
